﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace QuoteService
{
    interface IQuoteService
    {
        /// <summary>
        /// Возвращает экземпляр объекта. Реализует паттерн синглтон. Потокобезопасно
        /// </summary>
        static IQuoteService Instance{get;}
       
        /// <summary>
        /// Метод для осуществления подписки на котировки по заданному инструменту
        /// </summary>
        /// <param name="instrument">Название инструмента на который подписываться</param>
        void Subscribe(string instrument);

        /// <summary>
        /// Метод для осуществления подписки на котировки по заданным инструментам
        /// </summary>
        /// <param name="instruments">Названия инструментов на которые подписываться</param>
        void Subscribe(string[] instruments);

        /// <summary>
        /// Получение всех инструментов
        /// </summary>
        /// <returns>Список инструментов</returns>
        string[] GetAllInstruments();

        /// <summary>
        /// Отправка ордера
        /// </summary>
        /// <param name="instrument">Иструмент, по которому проводится сделка</param>
        /// <param name="quty">количество. Отрицательное - продажа, положительное-покупка, ноль-эксепшн</param>
        /// <returns>идентификатор ордера</returns>
        long PlaceOrder(string instrument, int quty);

        /// <summary>
        /// Отправка стоп или тэйк профит ордера
        /// </summary>
        /// <param name="instrument">Иструмент, по которому проводится сделка</param>
        /// <param name="quty">количество. Отрицательное - продажа, положительное-покупка, ноль-эксепшн</param>
        /// <param name="price">Стоп или тейкпрофит цена</param>
        /// <returns>идентификатор ордера</returns>
        long PlaceOrder(string instrument, int quty, double price);

        /// <summary>
        /// Отмена ордера
        /// </summary>
        /// <param name="ID">идентификатор ордера</param>
        void CancelOrder(long ID);

        /// <summary>
        /// ПРоверка статуса ордера
        /// </summary>
        /// <param name="ID">идентификатор ордера</param>
        /// <returns>Статус ордера</returns>
        OrderStatus CheckOrderStatus(long ID);

        /// <summary>
        /// Изменение цены для стоп и тэйкпрофит ордеров
        /// </summary>
        /// <param name="ID">идентификатор ордера</param>
        /// <param name="newPrice">новая цена</param>
        void MoveOrder(long ID, double newPrice);

    }
}
